Februar 2008, rešeni rok iz predmeta "Baze podataka"


fajlovi prikačeni uz rok.

U arhivi se nalaze: XML schema (.xsd), XML dokument (.xml), XQuery upit ili XPath putanja (.xq), SQl dump baze (.sql), visio 2003 dijagram (.vsd) ukoliko postoje takvi fajlovi vezani za zadatke.

XML: za sve fajlove je provereno da li su dobro oformljeni, a ako postoji i xml fajl i schema, xml fajl je validiran u odnosu na odgovarajuću šemu. Za kreiranje fajlova, proveru forme, validaciju, XPath i XQuery izraze korišćen je XML editor EditX http://www.editix.com/

SQL: baza je napravljena u MySQL-u pa prema tome SQL kod može imati netipičnu sintaksu ili funkcije različite od onih u knjizi. Upiti su provereni, prema mom shvatanju zadataka, koji često nisu baš lako shvatljivi. Najlakše je preko MySQLyog-a uraditi "restore from SQL dump" da bi mogli da probate upite nad podacima. Alati: MySQL http://www.mysql.com, MySQOyog www.webyog.com


1. zadatak

relacija:

RasporedVozila (ŠifraGaraže, RegBroj, NazivGaraže, GaražnoMesto, ŠifraTipaVozila, NazivTipaVozila)

funkcionalne zavisnosti:

ŠifraGaraže, RegBroj --> NazivGaraže, GaražnoMesto, ŠifraTipaVozila, NazivTipaVozila
ŠifraGaraže --> NazivGaraže
RegBroj --> ŠifraTipaVozila, NazivTipaVozila
ŠifraTipaVozila --> NazivTipaVozila
NazivTipaVozila --> ŠifraTipaVozila

definicije:

fukcionalna zavisnost:

u relaciji R atribut R.B (R.A i R.B mogu biti složeni) funkcionalno zavisi od atributa R.A (R.A funkcionalno određuje R.B) ako za svaku vrednost R.A postoji jedna i samo jedna vrednost R.B

potpuna funkcionalna zavisnost:

atribut R.B potpuno funkcionalno zavisi od atributa R.A ako funkcionalno zavisi od atributa R.A ali ne i od nekog pravog podskupa atributa R.A

determinanta:

determinanta je bilo koji prost ili složen atribut od koga neki drugi atribut u relaciji potpuno funkcionalno zavisi.

Boyce-Codd ova normalna forma:

Relacija R je u Boyce-Codd ovoj normalnoj formi ako su sve determinante ujedno i kandidati za ključ relacije.

determinante:

ŠifraGaraže --> NazivGaraže(D)
ŠifraTipaVozila --> NazivTipaVozila(D)
NazivTipaVozila --> ŠifraTipaVozila(D)
RegBroj --> NazivTipaVozila, ŠifraTipaVozila(D)
ŠifraGaraže, RegBroj --> GaražnoMesto(D)(KK)

očigledno je da relacija nije u BC normalnoj formi. Dekompozicijom pri kojoj se iz relacije izvlače projekcije sa onim determinantama koje nisu kandidati za ključ, relacija se svodi na BCNF.

Garaža(ŠifraGaraže, NazivGaraže) jeste BCNF
RasporedVozila2(ŠifraGaraže, RegBroj, GaražnoMesto, ŠifraTipaVozila, NazivTipaVozila) nije BCNF (4D, 1KK)

dalje se dekomponuje relacija RasporedVozila2

Vozilo(RegBroj, ŠifraTipaVozila, NazivTipaVozila) nije BCNF (3D, 1KK)
RasporedVozila3(ŠifraGaraže, RegBroj, GaražnoMesto) jeste BCNF

dalje se dekomponuje relacija Vozilo

Vozilo2(RegBroj, ŠifraTipaVozila) jeste BCNF
TipVozila(ŠifraTipaVozila, NazivTipaVozila) jeste BCNF

konačno:

Garaža(ŠifraGaraže, NazivGaraže)
RasporedVozila(ŠifraGaraže, RegBroj, GaražnoMesto)
Vozilo(RegBroj, ŠifraTipaVozila)
TipVozila(ŠifraTipaVozila, NazivTipaVozila)


2. zadatak

a)

A (A1#, A2)

B (B1#, B2, A1#)

AB1 (B1#, A1#)

C (A1#,C1#, C2)

D (A1#, D1)

E (A1#, E1)

F (A1#, F1)

G (A1#, G1, A1#, G1)

H (A1#, A1#, A1#, G1, H1)

b)

class A (extent As key A1#){

	attribute string A1#;
	attribute string A2;
	relationship set<Bgtt; AB1 inverse B :: BA1;
	relationship set<Bgtt; AB2 inverse B :: BA2;

};

class B (extent Bs key B1#){

	attribute string B1#;
	attribute string B2;
	relationship A BA1 inverse A :: AB1;
	relationship A BA2 inverse A :: AB2;

};

class D exdends A{

	attribute string D1;
	attribute set<Ggtt; Gs;

};

class G {

	attribute string G1;
	relationship G G1G2 inverse G :: G2G1;
	relationship set<Ggtt; G2G1 inverse G :: G1G2;
	relationship set<Hgtt; GH inverse H :: HG;

};

class H {

	attribute string H1;
	relationship C HC inverse C :: CH;
	relationship F HF inverse F :: FH;
	relationship G HG inverse G :: GH;

};

3. zadatak

  1. Integritet entiteta (integritet ključa)

    Ni jedan atribut koji je primarni ključ ili deo primarnog ključa neke bazne relacije ne može da uzme "nula vrednost"

  2. Referencijalni integritet

    Ako bayna relacija R1 poseduje spoljni ključ SK koji ovu relaciju povezuje sa baznom relacijom R2, tada svaka vrednost ključa SK mora biti bilo jednaka nekoj vrednosti primarnog ključa iz R2 ili "nula vrednost"

    ∏SK(R1) ⊆ ∏PK(R2) ∪ {null}
    

4. zadatak

Složeni konstruisani tipovi u objektno-relacionom bp su tip vrsta i tip kolekcija.


5. zadatak

a)

Graf prethođenja tranaskcija se sastoji od čvorova koji predstavljaju transakcije i usmerenih grana koje prikazuju prethođenje transakcija. Kaže se da Transakcija Ti prethodi transakciji Tj u izvršenju S ako postoji operacija Oi transakcije Ti i operacija Oj transakcije Tj tako da je:

  1. Oi prethodi Oj u S
  2. I Oi i Oj se odnose na isti element baze podataka
  3. Barem jedna od operacija Oi i Oj je upisivanje
Ako postoji ciklus u grafu tada izvršenje nije moguće učiniti serijabilnim (nije konflikt-serijabilno)

b)

S1

T2 prethodi T3 (operacije 3 i 6) T2 prethodi T1 (operacije 2 i 5) T1 prethodi T3 (operacije 5 i 8)
graf prethođenja:

Pošto na grafu nema ciklusa izvršenje jeste konflikt serijabilno!

S2

T2 prethodi T3 (operacije 1 i 6) T3 prethodi T2 (operacije 6 i 8, već ovde je jasno da izvršenje nije konflikt serijabilno) T2 prethodi T1 (operacije 2 i 4) T1 prethodi T3 (operacije 4 i 7)
graf prethođenja:

Pošto na grafu ima ciklusa izvršenje nije konflikt serijabilno!


6. zadatak

a)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Model">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Pacijent" type="PacijentType" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
        <xs:unique name="jedinstvenoImePrezime">
            <xs:selector xpath=".//Pacijent"/>
            <xs:field xpath="@ImePrezime"/>
        </xs:unique>
    </xs:element>
    <xs:complexType name="PacijentType">
        <xs:sequence>
            <xs:element name="Karton" type="KartonType"/>
        </xs:sequence>
        <xs:attribute name="JMBG" type="xs:ID" use="required"/>
        <xs:attribute name="ImePrezime" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="KartonType">
        <xs:attribute name="BrojKartona" type="xs:ID" use="required"/>
        <xs:attribute name="DatumPregleda" type="xs:date"/>
        <xs:attribute name="Dijagnoza" type="xs:string"/>
    </xs:complexType>
</xs:schema>

b)

<?xml version="1.0" encoding="UTF-8"?>
<Model
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="file:///D:/My%20FON/IV%20godina/I%20semestar/Baze%20podataka/BProkovi2008/feb2008/podA.xsd">
    <Pacijent JMBG="JMBG123123123123" ImePrezime="Pera Peric">
        <Karton BrojKartona="K1" DatumPregleda="2008-01-01" Dijagnoza="..."/>
    </Pacijent>
    <Pacijent JMBG="JMBG234234234234" ImePrezime="Petar Peric">
        <Karton BrojKartona="K2" DatumPregleda="2008-01-01" Dijagnoza="..."/>
    </Pacijent>
</Model>

c)

<xs:unique name="jedinstvenoImePrezime">
  	<xs:selector xpath=".//Pacijent"/>
	<xs:field xpath="@ImePrezime"/>
</xs:unique>

7. zadatak

a)

select	
	SifraZap, Ime, Prezime, Mlb, NazivProf
from
	ZAPOSLENI join ANGAZOVANJE using(SifraZap) join OBRAZOVNI_PROFIL using(SifraProf) join RADNI_STATUS using(SifraRS)
where
	StepenStrSpreme = 'IV' and NazivRS = 'probni rad' and DATE_ADD(DatOd,INTERVAL 2 month) > current_date

b)

select
	SifraRM, NazivRM, NazivProf
from	
	RADNO_MESTO join OBRAZOVNI_PROFIL using(SifraProf) join ANGAZOVANJE using(SifraRM)
where
	NazivProf like 'S%' and length(NazivProf)<=10 and DatDo is not null
group by
	SifraRM, NazivRM, NazivProf
having	
	count(*) > 5

c)

create view STATISTIKA(SIFRA_PROFILA, NAZIV_PROFILA, BR_ZAP_2006, BR_ZAP_2007, TREND, PROCENTUALNO) as
select
	SifraProf, 
	NazivProf, 
	sum(case when extract(year from datOd)=2006 then 1 else 0 end),
	sum(case when extract(year from datOd)=2007 then 1 else 0 end),
	case when sum(case when extract(year from datOd)=2006 then 1 else 0 end)>sum(case when extract(year from datOd)=2007 then 1 else 0 end) then 'PAD' when sum(case when extract(year from datOd)=2006 then 1 else 0 end)<sum(case when extract(year from datOd)=2007 then 1 else 0 end) then 'RAST' else 'BEZ_PROMENA' end ,
	(sum(case when extract(year from datOd)=2007 then 1 else 0 end)/sum(case when extract(year from datOd)=2006 then 1 else 0 end))*100
from
	OBRAZOVNI_PROFIL join RADNO_MESTO using(SifraProf) join ANGAZOVANJE using(SifraRM)
group by
	SifraProf, NazivProf

8. zadatak